package com.testing.mysql;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname MysqlTest
 * @Description 类型说明
 * @Date 2021/9/9 21:58
 * @Created by 特斯汀Roy
 */
public class MysqlTest {
    public static void main(String[] args) throws Exception {
        String user="a' or 1=1 #'";
        String password="1234567890";

        //编写特殊字符的正则表达式。除了允许字符以外的，都是特殊字符。
        Pattern specialW = Pattern.compile("[^\\w_\\-]");
        Matcher uM = specialW.matcher(user);
        Matcher pM=specialW.matcher(password);

        if(!uM.find()&&!pM.find()) {

            //1、声明一下驱动，相当于安装一个navicat，用于完成和数据库的连接
            Class.forName("com.mysql.jdbc.Driver");
            //2、创建一个连接
            //填写url、用户名、密码用于完成连接。
            //注意url的协议不再是http://，而是jdbc:mysql://,url中需要加上数据库的选择，路径就是数据库。
            Connection localMysql = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_project", "root", "roy123456");
            //3、新建一个查询
            Statement chaxun = localMysql.createStatement();
            String sql = "select * from userinfo where username='" + user + "' and password='" + password + "';";
            System.out.println(sql);
            //4、执行查询得到结果集
            ResultSet resultSet = chaxun.executeQuery(sql);
            //5、处理结果集，拿出查询的结果来。
            //获取表头行的信息
            ResultSetMetaData headerInfo = resultSet.getMetaData();
            //获取每一行一共有多少列
            int count = headerInfo.getColumnCount();
            //如果结果集不为空并且右下一行结果，取出来。
            List<Map<String, String>> resultList = new ArrayList<>();
            //遍历每一行
            while (resultSet != null && resultSet.next()) {
                //每一行存一个map
                Map<String, String> lineMap = new HashMap<>();
                //根据列名获取值
//            System.out.println(resultSet.getString("username"));
//            //根据列序号获取值
//            System.out.println(resultSet.getString(1));
//            System.out.println(resultSet.getString(2));
                //遍历每一列，并且还要获取列名,循环每一列来进行存储
                //获取查询到的结果有哪些列，获取表头行的信息中的列数以及列名来进行存储
                for (int i = 1; i <= count; i++) {
                    System.out.println(headerInfo.getColumnName(i) + "的值是" + resultSet.getString(i));
                    lineMap.put(headerInfo.getColumnName(i), resultSet.getString(i));
                }
                //遍历完每一列之后，map就存完了。
                resultList.add(lineMap);
            }
            System.out.println(resultList);


        }else{
            System.out.println("用户名密码中包含特殊字符");
        }
    }



}
